package top.codechap.ioc.framework.beans.factory.xml;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import top.codechap.ioc.framework.beans.BeanDefinition;
import top.codechap.ioc.framework.beans.MutablePropertyValues;
import top.codechap.ioc.framework.beans.PropertyValue;
import top.codechap.ioc.framework.beans.factory.support.BeanDefinitionReader;
import top.codechap.ioc.framework.beans.factory.support.BeanDefinitionRegistry;
import top.codechap.ioc.framework.beans.factory.support.SimpleBeanDefinitionRegistry;

import java.io.InputStream;
import java.util.List;

/**
 * 针对Xml配置文件解析的类
 */
public class XmlBeanDefinitionReader implements BeanDefinitionReader {

    //声明注册表对象
    private BeanDefinitionRegistry registry;

    public XmlBeanDefinitionReader() {
        this.registry = new SimpleBeanDefinitionRegistry();
    }

    @Override
    public BeanDefinitionRegistry getRegistry() {
        return registry;
    }

    @Override
    public void loadBeanDefinitions(String configLocation) throws Exception {
        //使用dom4j进行xml配置文件的解析
        SAXReader reader = new SAXReader();
        //获取类路径下的配置文件
        InputStream is = XmlBeanDefinitionReader.class.getClassLoader().getResourceAsStream(configLocation);
        Document document = reader.read(is);
        //根据document对象获取 根标签 对象(beans)
        Element rootElement = document.getRootElement();
        //获取 根标签 下所有的子标签对象(bean标签)
        List<Element> beanElements = rootElement.elements("bean");
        //遍历集合
        for (Element beanElement : beanElements) {
            //获取id属性
            String id = beanElement.attributeValue("id");
            //获取class属性
            String className = beanElement.attributeValue("class");
            //将id属性和class属性封装到BeanDefinition对象中
            //1.创建BeanDefinition
            BeanDefinition beanDefinition = new BeanDefinition();
            //2.封装id属性和class属性
            beanDefinition.setId(id);
            beanDefinition.setClassName(className);

            //创建 MutablePropertyValues 对象
            MutablePropertyValues mutablePropertyValues = new MutablePropertyValues();
            //获取bean标签下的全部property对象
            List<Element> propertyElements = beanElement.elements("property");
            for (Element propertyElement : propertyElements) {
                //获取name属性
                String name = propertyElement.attributeValue("name");
                //获取ref属性
                String ref = propertyElement.attributeValue("ref");
                //获取value属性
                String value = propertyElement.attributeValue("value");
                //将name,ref,value封装到 PropertyValue对象中,直接使用有参构造封装
                PropertyValue propertyValue = new PropertyValue(name,ref,value);
                //将封装好的 PropertyValue对象 ,放入 mutablePropertyValues 的容器中
                mutablePropertyValues.addPropertyValue(propertyValue);
            }
            //3.封装 MutablePropertyValues 对象
            beanDefinition.setPropertyValues(mutablePropertyValues);

            //将beanDefinition注册到注册表中
            registry.registryBeanDefinition(id,beanDefinition);
        }

    }
}
